package com.av.client.frames;

import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.beans.PropertyVetoException;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import java.util.logging.Level;

import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JDesktopPane;
import javax.swing.JFrame;
import javax.swing.JInternalFrame;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.ListSelectionModel;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.table.AbstractTableModel;

import org.jdesktop.swingx.JXErrorPane;
import org.jdesktop.swingx.error.ErrorInfo;

import com.av.client.components.AvButton;
import com.av.client.components.AvComponent;
import com.av.client.components.AvLabel;
import com.av.client.util.idioma.Error;
import com.av.client.util.idioma.Etiqueta;
import com.av.client.util.idioma.ManejadorIdiomas;
import com.av.client.util.idioma.ManejadorIdiomas.IdiomaEvent;
import com.av.client.util.idioma.ManejadorIdiomas.IdiomaEventListener;
import com.av.client.util.sesion.AdministradorSesion;
import com.av.db.dataobjects.Idioma;
import com.av.db.dataobjects.Tarjeta;
import com.av.db.dataobjects.Usuario;
import com.av.db.dataobjects.enums.Rol;
import com.av.exceptions.AvDBException;
import com.av.exceptions.AvException;
import com.av.rmi.CatalogoAcciones;
import com.av.rmi.Parametro;
import com.av.rmi.Parametro.Tipo;

@SuppressWarnings("serial")
public class UsuarioFrame extends JInternalFrame {

	private static final int WIDTH = 700;
	private static final int HEIGHT = 400;

	private AvLabel lblNombres;
	private JTextField txtNombres;
	private AvLabel lblApellidoPaterno;
	private JTextField txtApellidoPaterno;
	private AvLabel lblApellidoMaterno;
	private JTextField txtApellidoMaterno;
	private AvLabel lblUsuario;
	private JTextField txtUsuario;
	private AvLabel lblPassword;
	private JTextField txtPassword;
	private AvLabel lblPasswordConfirmacion;
	private JTextField txtPasswordConfirmacion;
	private JCheckBox chkActivo;
	private AvLabel lblRol;
	private JComboBox cboRol;
	private AvLabel lblIdioma;
	private JComboBox cboIdioma;
	private AvLabel lblTarjetas;
	private JList lstTarjetas;
	private JTable tblUsuarios;
	private AvButton btnAgregar;
	private AvButton btnActualizar;
	private AvButton btnEliminar;
	private AvButton btnCerrar;

	private UsuarioModel um;
	private ManejadorIdiomas mi;
	private BotonHandler bh = new BotonHandler();
	private Usuario usuarioSeleccionado;
	private Usuario[] usuarios;
	private Tarjeta[] tarjetasActivas;

	public UsuarioFrame() {
		super();
		mi = ManejadorIdiomas.getInstance();
		initComponents();
		addListeners();
		cargarPermisos();
		cargarUsuarios();
		limpiarTextos();
	}// UsuarioFrame

	/**
	 * Funcion que habilita o deshabilita los componentes de acuerdo a sus
	 * permisos asignados
	 */
	private void cargarPermisos() {
		if (AdministradorSesion.getInstance().getSesionActiva() != null) {
			Rol r = AdministradorSesion.getInstance().getSesionActiva()
					.getUsuario().getRol();
			for (Component c : this.getContentPane().getComponents()) {
				if (c instanceof JPanel) {
					for (Component c2 : ((JPanel) c).getComponents()) {
						if (c2 instanceof AvComponent) {
							c2.setEnabled(((AvComponent) c2).contains(r));
						}
					}
				} else if (c instanceof AvComponent) {
					c.setEnabled(((AvComponent) c).contains(r));
				}
			}
		}
	}// cargarPermisos

	private void addListeners() {
		mi.addIdiomaEventListener(new IdiomaEventListener() {
			@Override
			public void changedIdiomaEvent(IdiomaEvent evt) {
				setLabels();
			}
		});

		tblUsuarios.getSelectionModel().addListSelectionListener(
				new ListSelectionListener() {
					@Override
					public void valueChanged(ListSelectionEvent e) {
						if (usuarios != null
								&& tblUsuarios.getSelectedRow() >= 0
								&& tblUsuarios.getSelectedRow() < usuarios.length) {
							setUsuario(usuarios[tblUsuarios.getSelectedRow()]);
						}
					}
				});

		btnAgregar.addActionListener(bh);
		btnEliminar.addActionListener(bh);
		btnActualizar.addActionListener(bh);
		btnCerrar.addActionListener(bh);
	}// addListeners

	/**
	 * Funcion que restablece las etiquetas para todos los componentes
	 */
	private void setLabels() {
		setTitle(mi.obtenerEtiqueta(Etiqueta.USUARIO_FRAME_TITLE));
		lblNombres.setText(Etiqueta.USUARIO_FRAME_LBL_NOMBRES);
		lblApellidoPaterno.setText(Etiqueta.USUARIO_FRAME_LBL_APELLIDO_PATERNO);
		lblApellidoMaterno.setText(Etiqueta.USUARIO_FRAME_LBL_APELLIDO_MATERNO);
		lblUsuario.setText(Etiqueta.USUARIO_FRAME_LBL_USUARIO);
		chkActivo
				.setText(mi.obtenerEtiqueta(Etiqueta.USUARIO_FRAME_CHK_ACTIVO));
		lblPassword.setText(Etiqueta.USUARIO_FRAME_LBL_PASSWORD);
		lblPasswordConfirmacion
				.setText(Etiqueta.USUARIO_FRAME_LBL_PASSWORD_CONFIRMACION);
		lblRol.setText(Etiqueta.USUARIO_FRAME_LBL_ROL);
		lblIdioma.setText(Etiqueta.USUARIO_FRAME_LBL_IDIOMA);
		lblTarjetas.setText(Etiqueta.USUARIO_FRAME_LBL_TARJETAS);
		btnActualizar.setText(Etiqueta.USUARIO_FRAME_BTN_ACTUALIZAR);
		btnEliminar.setText(Etiqueta.USUARIO_FRAME_BTN_ELIMINAR);
		btnAgregar.setText(Etiqueta.USUARIO_FRAME_BTN_AGREGAR);
		btnCerrar.setText(Etiqueta.USUARIO_FRAME_BTN_CERRAR);
		String[] headers = (mi
				.obtenerEtiqueta(Etiqueta.USUARIO_FRAME_TBL_USUARIOS_COLUMN_NAMES))
				.split(",");
		if (headers != null && tblUsuarios.getColumnCount() == headers.length) {
			for (int i = 0; i < tblUsuarios.getColumnCount(); i++) {
				tblUsuarios.getColumnModel().getColumn(i).setHeaderValue(
						headers[i]);
			}
		}
	}// setLabels

	/**
	 * Funcion que configura todos los componentes y su correcta colocacion
	 */
	private void initComponents() {
		setTitle(mi.obtenerEtiqueta(Etiqueta.USUARIO_FRAME_TITLE));
		setSize(new Dimension());
		setLayout(new GridBagLayout());
		GridBagConstraints gc = new GridBagConstraints();

		gc.insets = new Insets(5, 5, 5, 5);
		gc.fill = GridBagConstraints.HORIZONTAL;

		// Nombres
		lblNombres = new AvLabel(Etiqueta.USUARIO_FRAME_LBL_NOMBRES);
		add(lblNombres, gc);

		gc.gridx = 1;
		gc.weightx = 1.0;
		gc.gridwidth = 3;
		txtNombres = new JTextField();
		add(txtNombres, gc);
		gc.weightx = 0.0;
		gc.gridwidth = 1;

		// Apellido Paterno
		gc.gridy = 1;
		gc.gridx = 0;
		lblApellidoPaterno = new AvLabel(
				Etiqueta.USUARIO_FRAME_LBL_APELLIDO_PATERNO);
		add(lblApellidoPaterno, gc);

		gc.gridx = 1;
		gc.weightx = 1.0;
		txtApellidoPaterno = new JTextField();
		add(txtApellidoPaterno, gc);
		gc.weightx = 0.0;

		// Apellido Materno
		gc.gridx = 2;
		lblApellidoMaterno = new AvLabel(
				Etiqueta.USUARIO_FRAME_LBL_APELLIDO_MATERNO);
		add(lblApellidoMaterno, gc);

		gc.gridx = 3;
		gc.weightx = 1.0;
		txtApellidoMaterno = new JTextField();
		add(txtApellidoMaterno, gc);
		gc.weightx = 0.0;

		// Usuario
		gc.gridy = 2;
		gc.gridx = 0;
		lblUsuario = new AvLabel(Etiqueta.USUARIO_FRAME_LBL_USUARIO);
		add(lblUsuario, gc);

		gc.gridx = 1;
		gc.weightx = 1.0;
		txtUsuario = new JTextField();
		add(txtUsuario, gc);
		gc.weightx = 0.0;

		// Activo
		gc.gridx = 2;
		gc.gridwidth = 2;
		chkActivo = new JCheckBox(mi
				.obtenerEtiqueta(Etiqueta.USUARIO_FRAME_CHK_ACTIVO));
		add(chkActivo, gc);
		gc.gridwidth = 1;

		// Password
		gc.gridy = 3;
		gc.gridx = 0;
		lblPassword = new AvLabel(Etiqueta.USUARIO_FRAME_LBL_PASSWORD);
		add(lblPassword, gc);

		gc.gridx = 1;
		gc.weightx = 1.0;
		txtPassword = new JPasswordField();
		add(txtPassword, gc);
		gc.weightx = 0.0;

		// Confirmacion de Password
		gc.gridx = 2;
		lblPasswordConfirmacion = new AvLabel(
				Etiqueta.USUARIO_FRAME_LBL_PASSWORD_CONFIRMACION);
		add(lblPasswordConfirmacion, gc);

		gc.gridx = 3;
		gc.weightx = 1.0;
		txtPasswordConfirmacion = new JPasswordField();
		add(txtPasswordConfirmacion, gc);
		gc.weightx = 0.0;

		// Rol
		gc.gridy = 4;
		gc.gridx = 0;
		lblRol = new AvLabel(Etiqueta.USUARIO_FRAME_LBL_ROL);
		add(lblRol, gc);

		gc.gridx = 1;
		gc.weightx = 1.0;
		cboRol = new JComboBox(Rol.values());
		add(cboRol, gc);
		gc.weightx = 0.0;

		// Idioma
		gc.gridx = 2;
		lblIdioma = new AvLabel(Etiqueta.USUARIO_FRAME_LBL_IDIOMA);
		add(lblIdioma, gc);

		gc.gridx = 3;
		gc.weightx = 1.0;
		cboIdioma = new JComboBox(Idioma.getIdiomas());
		add(cboIdioma, gc);
		gc.weightx = 0.0;

		// Tarjetas
		gc.gridy = 5;
		gc.gridx = 0;
		lblTarjetas = new AvLabel(Etiqueta.USUARIO_FRAME_LBL_TARJETAS);
		add(lblTarjetas, gc);

		gc.gridx = 1;
		gc.gridwidth = 3;
		gc.weighty = 1.0;
		gc.fill = GridBagConstraints.BOTH;
		tarjetasActivas = obtenerTarjetasActivas();
		lstTarjetas = new JList(tarjetasActivas);
		lstTarjetas.setEnabled(false);
		add(new JScrollPane(lstTarjetas), gc);
		gc.fill = GridBagConstraints.NONE;
		gc.weighty = 0.0;
		gc.gridwidth = 1;

		// Botones
		JPanel jpnl = new JPanel(new FlowLayout());

		btnAgregar = new AvButton(Etiqueta.USUARIO_FRAME_BTN_AGREGAR);
		btnAgregar.addPermiso(Rol.ADMIN);
		jpnl.add(btnAgregar);

		btnEliminar = new AvButton(Etiqueta.USUARIO_FRAME_BTN_ELIMINAR);
		btnEliminar.addPermiso(Rol.ADMIN);
		jpnl.add(btnEliminar);

		btnActualizar = new AvButton(Etiqueta.USUARIO_FRAME_BTN_ACTUALIZAR);
		btnActualizar.addPermiso(Rol.ADMIN);
		jpnl.add(btnActualizar);

		btnCerrar = new AvButton(Etiqueta.USUARIO_FRAME_BTN_CERRAR);
		btnCerrar.loadPermisos();
		jpnl.add(btnCerrar);

		gc.gridy = 6;
		gc.gridx = 0;
		gc.gridwidth = 4;
		gc.weightx = 1.0;
		add(jpnl, gc);
		gc.gridwidth = 1;
		gc.weightx = 0.0;

		// Tabla de resultados

		gc.gridy = 7;
		gc.gridwidth = 4;
		gc.weightx = 1.0;
		gc.weighty = 1.0;
		gc.fill = GridBagConstraints.BOTH;
		um = new UsuarioModel(0);
		tblUsuarios = new JTable(um);
		tblUsuarios
				.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);
		add(new JScrollPane(tblUsuarios), gc);

		setClosable(false);
		setSize(WIDTH, HEIGHT);
	}// initComponents

	/**
	 * Funcion que obtiene las tarjetas activas registradas en el sistema
	 * 
	 * @return
	 */
	private Tarjeta[] obtenerTarjetasActivas() {
		Tarjeta[] tmp = new Tarjeta[1];
		Parametro p = new Parametro();

		if (AdministradorSesion.getInstance().getSesionActiva() != null) {
			try {
				p.setAccion(CatalogoAcciones.OBTENER_ACTIVOS_TARJETA);
				p = AdministradorSesion.getInstance().getSesionActiva()
						.ejecutar(p);
				if (p.getValor(Tipo.OUTPUT) != null) {
					tmp = (Tarjeta[]) p.getValor(Tipo.OUTPUT);
				}
			} catch (AvException e) {
				ErrorInfo info = new ErrorInfo(getTitle() + " - ERROR", e
						.getMessage(), null, null, e, Level.INFO, null);
				JXErrorPane.setDefaultLocale(mi.getIdioma().getLocale());
				JXErrorPane.showDialog(getParent(), info);
			}
		}

		return tmp;
	}// obtenerTarjetasActivas

	private class UsuarioModel extends AbstractTableModel {
		private Map<Point, Object> lookup;
		private final int rows;
		private final int columns;
		private final String headers[];

		public UsuarioModel(int rows) {
			this.rows = rows;
			this.headers = mi.obtenerEtiqueta(
					Etiqueta.USUARIO_FRAME_TBL_USUARIOS_COLUMN_NAMES)
					.split(",");
			this.columns = headers.length;

			lookup = new HashMap<Point, Object>();
		}

		public int getColumnCount() {
			return columns;
		}

		public int getRowCount() {
			return rows;
		}

		public String getColumnName(int column) {
			return headers[column];
		}

		public Object getValueAt(int row, int column) {
			return lookup.get(new Point(row, column));
		}

		public void setValueAt(Object value, int row, int column) {
			if ((rows < 0) || (columns < 0)) {
				throw new IllegalArgumentException("Invalid row/column setting");
			}
			if ((row < rows) && (column < columns)) {
				lookup.put(new Point(row, column), value);
			}
		}
	}

	/**
	 * Funcion que valida que los campos requeridos del formulario
	 * 
	 * @throws AvDBException
	 */
	private void validarTextos() throws AvException {
		if (txtNombres.getText() == null
				|| txtNombres.getText().trim().length() == 0) {
			txtNombres.requestFocus();
			throw new AvException(mi
					.obtenerError(Error.USUARIO_FRAME_TXT_NOMBRES));
		}
		if (txtApellidoPaterno.getText() == null
				|| txtApellidoPaterno.getText().trim().length() == 0) {
			txtApellidoPaterno.requestFocus();
			throw new AvException(mi
					.obtenerError(Error.USUARIO_FRAME_TXT_APELLIDOPAT));
		}
		if (txtApellidoMaterno.getText() == null
				|| txtApellidoMaterno.getText().trim().length() == 0) {
			txtApellidoMaterno.requestFocus();
			throw new AvException(mi
					.obtenerError(Error.USUARIO_FRAME_TXT_APELLIDOMAT));
		}
		if (txtUsuario.getText() == null
				|| txtUsuario.getText().trim().length() == 0) {
			txtUsuario.requestFocus();
			throw new AvException(mi
					.obtenerError(Error.USUARIO_FRAME_TXT_USERNAME));
		}
		if (txtPassword.getText() == null
				|| txtPassword.getText().trim().length() == 0) {
			txtPassword.requestFocus();
			throw new AvException(mi
					.obtenerError(Error.USUARIO_FRAME_TXT_PASSWD));
		}
		if (!txtPassword.getText().equals(txtPasswordConfirmacion.getText())) {
			txtPasswordConfirmacion.requestFocus();
			throw new AvException(mi
					.obtenerError(Error.USUARIO_FRAME_TXT_NOMATCHPASS));
		}
		if (cboRol.getSelectedIndex() < 0) {
			cboRol.requestFocus();
			throw new AvException(mi.obtenerError(Error.USUARIO_FRAME_CBO_ROL));
		}
		if (cboIdioma.getSelectedIndex() < 0) {
			cboIdioma.requestFocus();
			throw new AvException(mi
					.obtenerError(Error.USUARIO_FRAME_CBO_IDIOMA));
		}
	}// validarTextos

	private Usuario getUsuario() {
		if (usuarioSeleccionado == null) {
			usuarioSeleccionado = new Usuario();
		}

		usuarioSeleccionado.setActivo(chkActivo.isSelected());
		usuarioSeleccionado.setApellidoMaterno(txtApellidoMaterno.getText());
		usuarioSeleccionado.setApellidoPaterno(txtApellidoPaterno.getText());
		usuarioSeleccionado.setIdioma((Idioma) cboIdioma.getSelectedItem());
		usuarioSeleccionado.setUser(txtUsuario.getText());
		usuarioSeleccionado.setNombres(txtNombres.getText());
		usuarioSeleccionado.setPassword(txtPassword.getText());
		usuarioSeleccionado.setRol((Rol) cboRol.getSelectedItem());

		Set<Tarjeta> tmp = new HashSet<Tarjeta>();
		for (Object t : lstTarjetas.getSelectedValues()) {
			tmp.add((Tarjeta) t);
		}

		usuarioSeleccionado.setTarjetas(tmp);

		return usuarioSeleccionado;
	}// getUsuario

	private void setUsuario(Usuario u) {
		if (u != null) {
			usuarioSeleccionado = u;

			txtUsuario.setText(u.getUser());
			chkActivo.setSelected(u.isActivo());
			txtApellidoMaterno.setText(u.getApellidoMaterno());
			txtApellidoPaterno.setText(u.getApellidoPaterno());
			cboIdioma.setSelectedItem(u.getIdioma());
			txtNombres.setText(u.getNombres());
			txtPassword.setText(u.getPassword());
			cboRol.setSelectedItem(u.getRol());
			lstTarjetas.clearSelection();
			for (Tarjeta t2 : u.getTarjetas()) {
				for (int i = 0; i < tarjetasActivas.length; i++) {
					if (tarjetasActivas[i].getId() == t2.getId()) {
						lstTarjetas.addSelectionInterval(i, i);
					}
				}
			}

		}
	}// setUsuario

	private void limpiarTextos() {
		chkActivo.setSelected(false);
		txtApellidoMaterno.setText("");
		txtApellidoPaterno.setText("");
		txtUsuario.setText("");
		cboIdioma.setSelectedItem(Idioma.getDefault());
		txtNombres.setText("");
		txtPassword.setText("");
		txtPasswordConfirmacion.setText("");
		cboRol.setSelectedIndex(-1);
		cboIdioma.setSelectedIndex(-1);
		lstTarjetas.clearSelection();
	}// limpiarTextos

	/**
	 * Clase creadad para la administracion de acciones
	 * 
	 * @author Victor J Morales R
	 * 
	 */
	private class BotonHandler implements ActionListener {
		@Override
		public void actionPerformed(ActionEvent ev) {
			Object o = ev.getSource();
			if (o instanceof AvButton) {
				if (o == btnCerrar) {
					dispose();
				} else if (o == btnActualizar) {
					try {
						validarTextos();
						actualizarUsuario();
					} catch (AvException e) {
						ErrorInfo info = new ErrorInfo(getTitle() + " - ERROR",
								e.getMessage(), null, null, e, Level.WARNING,
								null);
						JXErrorPane
								.setDefaultLocale(mi.getIdioma().getLocale());
						JXErrorPane.showDialog(getParent(), info);
					}

				} else if (o == btnEliminar) {
					try {
						validarTextos();
						eliminarUsuario();
					} catch (AvException e) {
						ErrorInfo info = new ErrorInfo(getTitle() + " - ERROR",
								e.getMessage(), null, null, e, Level.WARNING,
								null);
						JXErrorPane
								.setDefaultLocale(mi.getIdioma().getLocale());
						JXErrorPane.showDialog(getParent(), info);
					}
				} else if (o == btnAgregar) {
					try {
						validarTextos();
						agregarUsuario();
					} catch (AvException e) {
						ErrorInfo info = new ErrorInfo(getTitle() + " - ERROR",
								e.getMessage(), null, null, e, Level.WARNING,
								null);
						JXErrorPane
								.setDefaultLocale(mi.getIdioma().getLocale());
						JXErrorPane.showDialog(getParent(), info);
					}
				}
			}
		}// actionPerformed
	}// BotonHandler

	/**
	 * Funcion que agrega un usuario a partir de los datos capturados
	 * 
	 * @throws AvException
	 */
	private void agregarUsuario() throws AvException {
		Parametro p = new Parametro();
		p.setAccion(CatalogoAcciones.AGREGAR_USUARIO);
		usuarioSeleccionado = new Usuario();
		p.setValor(Tipo.INPUT, getUsuario());
		AdministradorSesion.getInstance().getSesionActiva().ejecutar(p);
		limpiarTextos();
		cargarUsuarios();
	}// agregarUsuario

	/**
	 * Funcion que actualiza un usuario con los datos capturados
	 * 
	 * @throws AvException
	 */
	private void actualizarUsuario() throws AvException {
		Parametro p = new Parametro();
		p.setAccion(CatalogoAcciones.ACTUALIZAR_USUARIO);
		p.setValor(Tipo.INPUT, getUsuario());
		AdministradorSesion.getInstance().getSesionActiva().ejecutar(p);
		limpiarTextos();
		cargarUsuarios();
	}// actualizarUsuario

	/**
	 * Funcion que elimina el usuario seleccionado
	 * 
	 * @throws AvException
	 */
	private void eliminarUsuario() throws AvException {
		Parametro p = new Parametro();
		p.setAccion(CatalogoAcciones.ELIMINAR_USUARIO);
		p.setValor(Tipo.INPUT, getUsuario());
		AdministradorSesion.getInstance().getSesionActiva().ejecutar(p);
		limpiarTextos();
		cargarUsuarios();
	}// actualizarUsuario

	/**
	 * Funcion que carga en la tabla todos los usuarios registrados en el
	 * sistema
	 */
	private void cargarUsuarios() {
		Parametro p = new Parametro();
		if (AdministradorSesion.getInstance().getSesionActiva() != null) {
			try {
				p.setAccion(CatalogoAcciones.OBTENER_TODOS_USUARIO);
				p = AdministradorSesion.getInstance().getSesionActiva()
						.ejecutar(p);
				if (p.getValor(Tipo.OUTPUT) != null) {
					usuarios = (Usuario[]) p.getValor(Tipo.OUTPUT);
					um = new UsuarioModel(usuarios.length);
					int row = 0;
					for (Usuario u : usuarios) {
						um.setValueAt(u.getNombres(), row, 0);
						um.setValueAt(u.getApellidoPaterno(), row, 1);
						um.setValueAt(u.getApellidoMaterno(), row, 2);
						um.setValueAt(u.getUser(), row, 3);
						um.setValueAt(u.isActivo(), row, 4);
						um.setValueAt(u.getRol(), row, 5);
						um.setValueAt(u.getIdioma(), row, 6);
						row++;
					}
					tblUsuarios.setModel(um);
				}
			} catch (AvException e) {
				ErrorInfo info = new ErrorInfo(getTitle() + " - ERROR", e
						.getMessage(), null, null, e, Level.INFO, null);
				JXErrorPane.setDefaultLocale(mi.getIdioma().getLocale());
				JXErrorPane.showDialog(getParent(), info);
			}
		}
	}// cargarUsuarios

	public static void main(String[] args) {
		JFrame tmp = new JFrame("Test");
		tmp.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		JDesktopPane desktop = new JDesktopPane();
		desktop.setBackground(Color.GRAY);
		desktop.setDragMode(JDesktopPane.OUTLINE_DRAG_MODE);
		tmp.setContentPane(desktop);

		UsuarioFrame ea = new UsuarioFrame();
		ea.setVisible(true);
		desktop.add(ea);
		try {
			ea.setSelected(true);
		} catch (PropertyVetoException e) {
		}
		tmp.setSize(new Dimension(ea.getWidth() + 100, ea.getHeight() + 100));
		tmp.setVisible(true);
	}// main

}// UsuarioFrame